package org.daymr.puzzle.tools;

import android.opengl.Matrix;

/**
 * 矩阵工具类
 * 
 * @author Ben
 * @date 2014年12月19日 下午11:13:41
 */
public class MatrixUtils {
	/** 投影矩阵 */
	private static float[] mProjMatrix = new float[16];
	/** 摄像机位置朝向9参数矩阵 */
	private static float[] mVMatrix = new float[16];
	/** 当前变换矩阵 */
	private static float[] currMatrix;

	/** 保护变换矩阵的栈 */
	static float[][] mStack = new float[10][16];
	/** 初始化栈顶 */
	static int stackTop = -1;

	/**
	 * 获取不变换初始矩阵
	 */
	public static void setInitMatrix() {
		currMatrix = new float[16];
		Matrix.setRotateM(currMatrix, 0, 0, 1, 0, 0);
	}

	/**
	 * 保护变换矩阵
	 */
	public static void pushMatrix(){
		stackTop++;
		for (int i = 0; i < 16; i++) {
			mStack[stackTop][i] = currMatrix[i];
		}
	}

	/**
	 * 恢复变换矩阵
	 */
	public static void popMatrix(){
		for (int i = 0; i < 16; i++) {
			currMatrix[i] = mStack[stackTop][i];
		}
		stackTop--;
	}

	/**
	 * 设置沿xyz轴移动
	 * 
	 * @param x
	 * @param y
	 * @param z
	 */
	public static void transtate(float x, float y, float z) {
		Matrix.translateM(currMatrix, 0, x, y, z);
	}

	/**
	 * 设置绕xyz轴转动
	 * 
	 * @param angle
	 * @param x
	 * @param y
	 * @param z
	 */
	public static void rotate(float angle, float x, float y, float z) {
		Matrix.rotateM(currMatrix, 0, angle, x, y, z);
	}
	
	/**
	 * 设置缩放
	 * @param x
	 * @param y
	 * @param z
	 */
	public static void scale(float x,float y,float z){
    	Matrix.scaleM(currMatrix,0, x, y, z);
    }
	

	/**
	 * 设置摄像机
	 * 
	 * @param cx
	 *            摄像机位置x
	 * @param cy
	 *            摄像机位置y
	 * @param cz
	 *            摄像机位置z
	 * @param tx
	 *            摄像机目标点x
	 * @param ty
	 *            摄像机目标点y
	 * @param tz
	 *            摄像机目标点z
	 * @param upx
	 *            摄像机UP向量X分量
	 * @param upy
	 *            摄像机UP向量Y分量
	 * @param upz
	 *            摄像机UP向量Z分量
	 */
	public static void setCamera(float cx, float cy, float cz, float tx,
			float ty, float tz, float upx, float upy, float upz) {
		Matrix.setLookAtM(mVMatrix, 0, cx, cy, cz, tx, ty, tz, upx, upy, upz);
	}

	/**
	 * 设置透视投影参数
	 * 
	 * @param left
	 *            近平面的left
	 * @param right
	 *            近平面的right
	 * @param bottom
	 *            近平面的bottom
	 * @param top
	 *            近平面的top
	 * @param near
	 *            近平面距离
	 * @param far
	 *            远平面距离
	 */
	public static void setProjectFrustum(float left, float right, float bottom,
			float top, float near, float far) {
		Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far);
	}

	/**
	 * 设置正交投影参数
	 * 
	 * @param left
	 *            近平面的left
	 * @param right
	 *            近平面的right
	 * @param bottom
	 *            近平面的bottom
	 * @param top
	 *            近平面的top
	 * @param near
	 *            近平面距离
	 * @param far
	 *            远平面距离
	 */
	public static void setProjectOrtho(float left, float right, float bottom,
			float top, float near, float far) {
		Matrix.orthoM(mProjMatrix, 0, left, right, bottom, top, near, far);
	}

	/**
	 * 获取具体物体的总变换矩阵
	 * 
	 * @return
	 */
	public static float[] getFinalMatrix() {
		float[] mMVPMatrix = new float[16];
		Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, currMatrix, 0);
		Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
		return mMVPMatrix;
	}

}
